/*
 * Copyright (c) 2012 Jonathan Perry
 * This code is released under the MIT license (see LICENSE file).
 */
#include "codes/turbo/TurboCodec.h"

#include <stdexcept>
#include <boost/static_assert.hpp>
#include "codes/RandomPermutationGenerator.h"

void TurboCodec::getInterleaver(uint32_t messageLength, itpp::ivec & interleaver)
{
	if(messageLength == 1530) {
		interleaver.set("3 1051 527 285 1285 769 131 1161 655 401 1413 935 83 1115 591 365 1349 865 205 1225 719 465 1477 975 6 1078 542 314 1290 770 134 1170 670 418 1418 910 102 1142 606 346 1354 834 218 1234 734 482 1482 990 9 1041 557 279 1295 771 137 1179 685 435 1423 949 121 1105 621 327 1359 867 231 1243 749 499 1487 1005 12 1068 572 308 1300 772 140 1188 700 388 1428 924 76 1132 636 372 1364 836 244 1252 764 452 1492 1020 15 1031 523 273 1305 773 143 1197 651 405 1433 899 95 1095 587 353 1369 869 193 1261 715 469 1497 971 18 1058 538 302 1310 774 146 1206 666 422 1438 938 114 1122 602 334 1374 838 206 1270 730 486 1502 986 21 1085 553 267 1315 775 149 1215 681 439 1443 913 69 1149 617 379 1379 871 219 1279 745 503 1507 1001 24 1048 568 296 1320 776 152 1160 696 392 1448 952 88 1112 632 360 1384 840 232 1224 760 456 1512 1016 27 1075 519 261 1325 777 155 1169 647 409 1453 927 107 1139 583 341 1389 873 245 1233 711 473 1517 967 30 1038 534 290 1330 778 158 1178 662 426 1458 902 126 1102 598 322 1394 842 194 1242 726 490 1522 982 33 1065 549 319 1335 779 161 1187 677 443 1463 941 81 1129 613 367 1399 875 207 1251 741 507 1527 997 36 1028 564 284 1340 780 164 1196 692 396 1468 916 100 1092 628 348 1404 844 220 1260 756 460 1012 39 1055 515 313 1281 781 167 1205 643 413 1409 955 119 1119 579 329 1345 877 233 1269 707 477 1473 963 42 1082 530 278 1286 782 170 1214 658 430 1414 930 74 1146 594 374 1350 846 246 1278 722 494 1478 978 45 1045 545 307 1291 783 173 1159 673 447 1419 905 93 1109 609 355 1355 879 195 1223 737 511 1483 993 48 1072 560 272 1296 784 176 1168 688 400 1424 944 112 1136 624 336 1360 848 208 1232 752 464 1488 1008 51 1035 575 301 1301 785 179 1177 703 417 1429 919 67 1099 639 381 1365 881 221 1241 767 481 1493 1023 54 1062 526 266 1306 786 182 1186 654 434 1434 958 86 1126 590 362 1370 850 234 1250 718 498 1498 974 57 1025 541 295 1311 787 185 1195 669 387 1439 933 105 1089 605 343 1375 883 247 1259 733 451 1503 989 60 1052 556 260 1316 788 188 1204 684 404 1444 908 124 1116 620 324 1380 852 196 1268 748 468 1508 1004 63 1079 571 289 1321 789 191 1213 699 421 1449 947 79 1143 635 369 1385 885 209 1277 763 485 1513 1019 2 1042 522 318 1326 790 130 1158 650 438 1454 922 98 1106 586 350 1390 854 222 1222 714 502 1518 970 5 1069 537 283 1331 791 133 1167 665 391 1459 897 117 1133 601 331 1395 887 235 1231 729 455 1523 985 8 1032 552 312 1336 792 136 1176 680 408 1464 936 72 1096 616 376 1400 856 248 1240 744 472 1528 1000 11 1059 567 277 1341 793 139 1185 695 425 1469 911 91 1123 631 357 1405 889 197 1249 759 489 1015 14 1086 518 306 1282 794 142 1194 646 442 1410 950 110 1150 582 338 1346 858 210 1258 710 506 1474 966 17 1049 533 271 1287 795 145 1203 661 395 1415 925 65 1113 597 383 1351 891 223 1267 725 459 1479 981 20 1076 548 300 1292 796 148 1212 676 412 1420 900 84 1140 612 364 1356 860 236 1276 740 476 1484 996 23 1039 563 265 1297 797 151 1157 691 429 1425 939 103 1103 627 345 1361 893 249 1221 755 493 1489 1011 26 1066 514 294 1302 798 154 1166 642 446 1430 914 122 1130 578 326 1366 862 198 1230 706 510 1494 962 29 1029 529 259 1307 799 157 1175 657 399 1435 953 77 1093 593 371 1371 895 211 1239 721 463 1499 977 32 1056 544 288 1312 800 160 1184 672 416 1440 928 96 1120 608 352 1376 864 224 1248 736 480 1504 992 35 1083 559 317 1317 801 163 1193 687 433 1445 903 115 1147 623 333 1381 833 237 1257 751 497 1509 1007 38 1046 574 282 1322 802 166 1202 702 386 1450 942 70 1110 638 378 1386 866 250 1266 766 450 1514 1022 41 1073 525 311 1327 803 169 1211 653 403 1455 917 89 1137 589 359 1391 835 199 1275 717 467 1519 973 44 1036 540 276 1332 804 172 1156 668 420 1460 956 108 1100 604 340 1396 868 212 1220 732 484 1524 988 47 1063 555 305 1337 805 175 1165 683 437 1465 931 127 1127 619 321 1401 837 225 1229 747 501 1529 1003 50 1026 570 270 1342 806 178 1174 698 390 1470 906 82 1090 634 366 1406 870 238 1238 762 454 1018 53 1053 521 299 1283 807 181 1183 649 407 1411 945 101 1117 585 347 1347 839 251 1247 713 471 1475 969 56 1080 536 264 1288 808 184 1192 664 424 1416 920 120 1144 600 328 1352 872 200 1256 728 488 1480 984 59 1043 551 293 1293 809 187 1201 679 441 1421 959 75 1107 615 373 1357 841 213 1265 743 505 1485 999 62 1070 566 258 1298 810 190 1210 694 394 1426 934 94 1134 630 354 1362 874 226 1274 758 458 1490 1014 1 1033 517 287 1303 811 129 1155 645 411 1431 909 113 1097 581 335 1367 843 239 1219 709 475 1495 965 4 1060 532 316 1308 812 132 1164 660 428 1436 948 68 1124 596 380 1372 876 252 1228 724 492 1500 980 7 1087 547 281 1313 813 135 1173 675 445 1441 923 87 1151 611 361 1377 845 201 1237 739 509 1505 995 10 1050 562 310 1318 814 138 1182 690 398 1446 898 106 1114 626 342 1382 878 214 1246 754 462 1510 1010 13 1077 513 275 1323 815 141 1191 641 415 1451 937 125 1141 577 323 1387 847 227 1255 705 479 1515 961 16 1040 528 304 1328 816 144 1200 656 432 1456 912 80 1104 592 368 1392 880 240 1264 720 496 1520 976 19 1067 543 269 1333 817 147 1209 671 385 1461 951 99 1131 607 349 1397 849 253 1273 735 449 1525 991 22 1030 558 298 1338 818 150 1154 686 402 1466 926 118 1094 622 330 1402 882 202 1218 750 466 1006 25 1057 573 263 1343 819 153 1163 701 419 1471 901 73 1121 637 375 1407 851 215 1227 765 483 1021 28 1084 524 292 1284 820 156 1172 652 436 1412 940 92 1148 588 356 1348 884 228 1236 716 500 1476 972 31 1047 539 257 1289 821 159 1181 667 389 1417 915 111 1111 603 337 1353 853 241 1245 731 453 1481 987 34 1074 554 286 1294 822 162 1190 682 406 1422 954 66 1138 618 382 1358 886 254 1254 746 470 1486 1002 37 1037 569 315 1299 823 165 1199 697 423 1427 929 85 1101 633 363 1363 855 203 1263 761 487 1491 1017 40 1064 520 280 1304 824 168 1208 648 440 1432 904 104 1128 584 344 1368 888 216 1272 712 504 1496 968 43 1027 535 309 1309 825 171 1153 663 393 1437 943 123 1091 599 325 1373 857 229 1217 727 457 1501 983 46 1054 550 274 1314 826 174 1162 678 410 1442 918 78 1118 614 370 1378 890 242 1226 742 474 1506 998 49 1081 565 303 1319 827 177 1171 693 427 1447 957 97 1145 629 351 1383 859 255 1235 757 491 1511 1013 52 1044 516 268 1324 828 180 1180 644 444 1452 932 116 1108 580 332 1388 892 204 1244 708 508 1516 964 55 1071 531 297 1329 829 183 1189 659 397 1457 907 71 1135 595 377 1393 861 217 1253 723 461 1521 979 58 1034 546 262 1334 830 186 1198 674 414 1462 946 90 1098 610 358 1398 894 230 1262 738 478 1526 994 61 1061 561 291 1339 831 189 1207 689 431 1467 921 109 1125 625 339 1403 863 243 1271 753 495 1009 0 1024 512 256 1280 768 128 1152 640 384 1408 896 64 1088 576 320 1344 832 192 1216 704 448 1472 960");
	} else {
		BOOST_STATIC_ASSERT(RandomPermutationGenerator::SEED_SIZE_UINTS == 4);

		// Get permutation generator
		uint32_t seed[4] = {3556489631, 1155265033, 511362789, 2977333701};
		RandomPermutationGenerator permGen(messageLength, seed);

		// set destination size
		interleaver.set_size(messageLength, false);

		// fill the interleaver sequence
		for(uint32_t i = 0; i < messageLength; i++) {
			interleaver[i] = permGen.next();
		}
	}
}

